! — оператор комментария. То, что находится в строке после оператора комментария, и до конца строки игнорируется интерпретатором. Оператор комментария позволяет "закомментировать" (выключить) ненужный временно оператор / функцию во время отладки игры. Кроме того, написание комментариев к коду программы является одним из признаков хорошего стиля программирования.
Необходимо чётко понимать, что это именно оператор, поэтому если вы комментируете некую строку кода, то ! должен стоять после &:
Комментарии могут быть однострочными, то есть заканчиваться в той же строке, где стоит оператор комментария:
Комментарии могут быть многострочными. Для этого после оператора комментария нужно записать кавычки, апострофы, или фигурные скобки. Например так:
Многострочные комментарии могут принимать самые разнообразные формы:
*CLEAR — очищает окно основного описания. Имеет краткую форму *clr.
*NL — переход на новую строку, затем вывод текста в окне основного описания. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. Если [$текст] отсутствует, происходит просто переход на новую строку. Пример:
*P — вывод текста в окно основного описания без перехода на новую строку. Вывод текста любым другим оператором сразу после *p добавит новый текст сразу после текущего. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может быть пустой строкой '', но не должен отсутствовать. Пример:
*PL — вывод текста в окно основного описания, затем переход на новую строку. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может отсутствовать, тогда просто переход на новую строку. Пример:
Аналогичным образом можно вывести текст, просто написав нужное выражение вместо данного оператора. Например, строки:
и:
сработают одинаково.
ACT — создаёт и выводит в окно действий новое действие.
Общая запись в однострочной форме:
Общая запись в многострочной форме:
К списку действий в окне действий добавляется новое с названием [$название] и изображением, которое лежит по пути [$путь к файлу изображения]. При нажатии на действие выполняются заданные операторы.
Параметр [$путь к файлу изображения] может отсутствовать, при этом действие добавится без изображения.
Примеры:
Если в списке действий уже есть действие с указанным названием, то новое действие не создаётся, и не заменяет собой уже существующее, плеер просто игнорирует команду act. Таким образом нельзя вывести действия с одинаковыми названиями. Пример:
Однако, вы можете сымитировать действия с одинаковыми названиями в режиме распознавания HTML, добавив в названия действий несуществующий HTML-тег:
ADDOBJ — добавление нового предмета в окно предметов. Общая запись:
, где [$название] — это название предмета, [$путь к файлу изображения] — это путь к файлу изображения предмета (отображается рядом с названием предмета), а [#позиция] — на какое место в инвентаре добавляется предмет. Параметр [#позиция] может отсутствовать. По умолчанию предметы добавляются в конец списка. Нумерация предметов в инвентаре ведётся с 1. Параметр [$путь к файлу изображения] может отсутствовать, значение по умолчанию - '', при этом предмет добавляется без изображения.
Допускается, но не рекомендуется, запись:
Можно добавлять предметы с одинаковым названием, однако если вы планируете добавлять много одинаковых предметов, то лучше использовать дополнительную переменную для подсчёта этих предметов, а в окно предметов добавить один предмет, чтобы не загромождать инвентарь списком из 137 предметов Рубль / Патрон:
Для хранения числа предметов можно использовать массивы, индексируемые через строки:
Пример добавления предмета в самый верх списка (при этом все остальные предметы сместятся вниз):
ADDQST — из заданного файла игры добавляет все локации, названия которых отсутствуют среди текущих игровых локаций. Загруженные локации полностью эквивалентны локациям из основного файла игры. Общая запись:
В более новых версиях библиотеки команда переименована в addlib (нигде не использовалось), затем в inclib (использовалась в Quest Navigator и будет использоваться в плеерах с библиотекой версии 5.8.0 и выше).
Пример:
CLA - очистка списка текущих действий (удаление всех действий из окна действий).
CLEAR — очищает окно дополнительного описания. Имеет краткую форму clr.
CLOSE — останавливает проигрывание указанного звукового файла. Общая запись:
, где [$путь к звуковому файлу] — путь к звуковому файлу относительно файла игры. Если параметр [$путь к звуковому файлу] не указан, происходит остановка воспроизведения всех звуковых файлов.
CLOSE ALL — остановка проигрывания всех активных звуковых файлов. Имеет краткую форму close.
CLS — очищает все окна кроме списка предметов. Эквивалентно конструкции:
CMDCLEAR — очистка строки ввода. Имеет краткую форму cmdclr.
COPYARR — копирование содержимого одного массива в другой. Общая запись:
, где: [$приёмник] — это массив, в который производится копирование, размер и наполнение значения не имеют; [$источник] — это массив, из которого производится копирование; [#начало] — номер элемента, с которого нужно начинать копирование; [#количество] — сколько элементов нужно скопировать. Параметр [#количество] является необязательным; по умолчанию — до конца массива-источника. Параметр [#начало] является необязательным; по умолчанию — 0.
Примеры:
В силу особенностей плеера при копировании, например, числового массива mass1 в mass2 копируется также текстовый массив $mass1 в $mass2.
Другие примеры:
DELACT — удаляет действие из списка действий (если такое действие существует). Общая запись:
, где [$название] — название действия, которое хотим удалить.
Примеры:
Допустима, но не одобряется, форма записи:
DELOBJ — удаление предмета из инвентаря по названию (если такой предмет существует). Общая запись:
, где [$название] — название предмета, который хотим удалить.
Если в инвентаре присутствуют одинаковые предметы, команда удалит самый верхний с указанным индексом.
Примеры:
Допустима, но не одобряется, форма записи:
DYNAMIC — выполняет код, переданный в виде строки текста. Общая запись:
, где [$код] — это обычный код QSP, записанный в виде текста. Выполнение такого кода аналогично выполнению кода оператора GOSUB. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться внутри [$код], их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. После выполнения старые параметры args восстанавливаются, затем продолжается выполнение кода со следующей команды после dynamic.
Примеры:
Нижеследующая информация справедлива и для функции dyneval (см. соответствующий раздел).
Важно! Если код задан с помощью одинарных ('') или двойных ("") кавычек, в тексте вычисляются подвыражения:
В этом случае при задании переменной $code будет вычислено подвыражение, поэтому первой строкой выведется 'qwerty', второй строкой выведется 'asdfg'.
Фигурные скобки - третий вид кавычек используемый специально для написания динамического кода. Здесь поддерживается вложенность скобок, а перед выполнением кода не вычисляются подвыражения:
В этом случае будут выведены две строки 'asdfg'.
EXIT — завершение выполнения текущего блока кода (преждевременный выход из подпрограммы, функции, обработчика какого-либо события, и т.д.).
В качестве блока кода может выступать локация, действие, код, переданный dynamic'у или dyneval'у, или код в гиперссылке.
Пример:
Внимание!!! В более новых версиях плеера (5.8.0 и выше) есть оператор цикла loop, и тело цикла так же считается отдельным блоком кода, однако оператор exit прерывает не только сам цикл, но и блок кода, в котором находится цикл.
GOSUB — выполнение кода указанной локации без непосредственного перехода на неё.
Общая запись:
, где [$локация] — это название локации, код которой мы хотим выполнить без непосредственного перехода на неё. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. После обработки локации предыдущие значения args восстанавливаются. Использование аргументов не обязательно.
При обращении к локации по gosub базовое описание локации добавляется к текущему описанию, базовые действия добавляются к текущим действиям, и происходит выполнение операторов в поле "Выполнить при посещении", затем возврат на исходную строку (продолжение выполнения кода после gosub).
Примеры вызова локаций по gosub:
Ещё пример:
Оператор имеет краткую форму gs:
GOTO — переход на указанную локацию. Общая запись:
, где [$локация] — название локации, на которую должен быть осуществлён переход. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. Использование аргументов не обязательно.
При переходе на новую локацию при помощи goto очищается окно основного описания, а также список текущих действий, затем в окно основного описания выводится текст базового описания, в окно действий — базовые действия, а так же выполняется код из поля "Выполнить при посещении" локации [$локация]. Так же при переходе на новую локацию изменяется значение, возвращаемое функцией $curloc.
Примеры:
Оператор имеет краткую форму gt:
IF — оператор условия. Собственно для того и нужен, чтобы проверять выполнение какого-либо условия. Имеет несколько форм записи.
Простая однострочная форма записи:
Как видите, за ключевым словом if следует выражение [#выражение], и если это выражение верно, тогда выполняется набор команд [команда 1], [команда 2], и т.д., которые записаны после двоеточия в той же строке. При этом команды перечисляются через амперсанд (&).
Именно по наличию команд сразу в той же строке после двоеточия плеер определяет, что это однострочная форма, и считает конец этой строки концом конструкции условия.
Примеры:
Сложная однострочная форма записи:
Здесь снова за ключевым словом if следует [#выражение], истиность которого требуется проверить. Если выражение верно, выполняется набор команд [команда д1], [команда д2] и т.д., от двоеточия до ключевого слова else. В противном случае, если выражение [#выражение] неверно, выполняется набор команд [команда н1], [команда н2] и т.д., от else и до конца строки. Точно так же, как и для простой однострочной формы, концом конструкции условия считается конец строки.
Примеры сложной однострочной формы:
Простая многострочная форма записи в общем виде выглядит вот так:
Как видите, она отличается от простой однострочной формы записи тем, что команды [команда 1], [команда 2] и т.д. записаны не сразу после двоеточия, а только в следующей строке. Именно так плеер понимает, что имеет дело с многострочной формой записи. Наличие или отсутствие пробелов или символов табуляции перед командами роли не играет, однако, чтобы плеер понял, где заканчивается конструкция условия, в конце на отдельной строке необходимо прописывать ключевое слово end, или end if.
Примеры:
Сложная многострочная форма в общей записи выглядит вот так:
Здесь так же комнады [команда д1], [команда д2] и т.д. записываются не сразу после двоеточия, а только в следующей строке. Ключевое слово else так же записывается в отдельной строке, и команды [команда н1], [команда н2] и т.д. идут в последующих строках после else. Завершается конструкция условия ключевым словом end (или end if), которое снова идёт отдельной строкой.
При верности выражения [#выражение] выполняется набор команд между двоеточием и else, а если [#выражение] неверно, выполняется набор команд между else и end.
Примеры:
Ещё одна форма записи работает только в многострочном варианте (обещали исправить в новых версиях). Это расширенная форма. Она позволяет размещать на одном уровне вложенности последовательно-исключающие условия. Общая форма записи такая:
Правила записи такие же, как и для других видов многострочных условий. После двоеточия в той же строке, где находится оператор if или elseif не должно идти никаких команд, только со следующей строки. Вся конструкция должна заканчиваться оператором end (или end if), стоящим в отдельной строке. В конструкции может как присутствовать, так и отсуствовать часть с else.
Работает это следующим образом. Если [#выражение 1] верно, выполняются команды [набор команд 1]. Если [#выражение 1] неверно, но верно [#выражение 2], выполняются команды [набор команд 2], и т.д. И только если неверны все выражения в текущей конструкции условия, выполнятся команды после else.
Как вы понимаете, верность выражения [#выражение 1] не исключает верности выражения [#выражение 2], однако верность выражения [#выражение 2] исключает верность выражения [#выражение 1]. Поэтому я и назвал эту конструкцию конструкцией последовательно-исключающих условий.
Примеры:
Обратите внимание. Ключевым словом end заканчивается не каждый отдельный elseif, а вся конструкция условия.
Для многострочных форм записи допускается вложенность неограниченной глубины. Каждый уровень вложения должен заканчиваться своей строкой end.
Примеры:
Несколько примеров неверной записи:
JUMP — переход в текущем блоке кода на указанную метку. Общая запись:
, где [$метка] — это метка ниже или выше по коду (см. раздел "Метки").
jump находит метку только в пределах текущего блока кода, то есть метки локальны.
Отдельными блоками кода в QSP являются:
Пример:
С помощью оператора jump можно организовывать циклы:
Двойной цикл с одной меткой:
KILLALL — уничтожает все переменные и удаляет все предметы из окна предметов. Эквивалентен конструкции:
Обратите внимание, killall не эквивалентен конструкции:
поскольку в этом случае значения переменных удаляются после удаления предметов, а значит код локации-обработчика удаления предметов успевает выполниться (см. $onobjdel).
Обычно killall используют в начале игры, если в конце игры предусмотрено действие "Начать заново".
KILLOBJ — удаление предмета, расположенного в заданной позиции. Общая запись:
, где [#номер] — номер предмета в окне инвентаря. Нумерация предметов начинается с 1. Если параметр [#номер] не указан, удаляются все предметы. При удалении каждого предмета с помощью killobj, происходит выполнение кода локации-обработчика удаления предметов (см. $onobjdel).
Пример:
KILLQST — удаляет все локации, добавленные с помощью оператора addqst. В более новых версиях библиотеки команда переименована в dellib, затем в freelib.
KILLVAR — удаление указанного элемента массива. Общая запись:
, где [$название массива] — название массива, из которого хотим удалить элемент, а [#индекс элемента] — номер элемента в массиве, который хотим удалить. Нумерация элементов массивов начинается с 0.
Если индекс элемента не указан, то очищается весь массив. Если оператор вызван без аргументов, то удаляются все переменные и массивы.
Примеры:
При удалении элемента все следующие за ним элементы сдвигаются на позицию вверх.
Пример:
LET — устаревший оператор для установки значения переменной. Общая запись:
, где [название переменной] — это допустимое имя переменной, [выражение] — это допустимое для данной переменной значение.
Названия числовых переменных записываются без символа $ в начале. Названия текстовых переменных записываются с символом $ в начале. Примеры:
Данный оператор является устаревшим, как и оператор set, поскольку в настоящее время значение переменной устанавливается через присвоение:
Использование операторов set и let не рекомендуется.
MENU — в любом месте игры выводит на экран всплывающее меню, пункты которого прописаны в указанном массиве. Общая запись:
Прежде, чем использовать данный оператор, необходимо заполнить массив, на основе содержимого которого будут формироваться пункты меню. Пункты меню — это строковые начения массива с особым форматом записи:
Название пункта меню — это то, что мы увидим на экране, когда меню будет выведено; название локации — это название локации, код которой будет выполняться при щелчке на соответствующем пункте меню; путь к файлу иконки — это путь к файлу изображения, которое будет выведено рядом с названием пункта меню.
Таким образом мы можем заполнить массив для того, чтоб создать наши пункты меню:
Поиск символов ":" начинается с конца строки, то есть название пункта меню может содержать двоеточия, однако тогда обязательно после названия локации должно стоять двоеточие, даже если вы не используете иконки для пунктов меню.
Если путь к файлу иконки не указан или указанный файл недоступен, то пункт меню отобразится без иконки.
Здесь название массива ($stone) - это название меню, а текстовые значения массива - действия, для которых указаны названия и названия локаций-обработчиков выбора пунктов меню. При выборе пункта "Взять камень" произойдёт обработка локации с названием "takestone". Аналогично будет происходить с другими пунктами.
Чтобы вызвать меню на экран нужно воспользоваться оператором menu:
Меню можно вызывать в любом месте игры, например, из гиперссылок:
В локацию-обработчик выбора пункта меню передаётся аргумент (args[0]) - позиция выбранного пункта. Позиции элементов меню нумеруются с 1.
Пример создания меню с иконками:
Меню заканчивается на элементе массива со значением '' (пустая строка). Т.е. если массив меню состоит из элементов 'Взять','Осмотреть','','Бросить', то 2 последних пункта меню не будут созданы:
Чтобы вставить разделитель в меню, вместо соответствующего элемента массива напишите "-:-". Т.е. если нужно поставить разделитель вместо 3-го элемента:
MSG — вывод указанного сообщения в диалоговом окне. Общая запись:
, где [сообщение] — любая строка текста. число, выражение любого типа. Примеры:
Примеры:
NL — переход на новую строку, затем вывод текста в окне основногодополнительного описания. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. Если [$текст] отсутствует, происходит просто переход на новую строку. Пример:
OPENGAME — загрузка указанного файла состояния игры. Общая запись:
, где [$путь] — путь к файлу сохранённого состояния игры. Если параметр [$путь] отсутствует, то вызывается окно загрузки состояния игры.
Пример:
См. также локацию-обработчик события загрузки состояния игры ($ongload).
OPENQST — открытие и запуск указанного файла игры. Общая запись:
, где [$путь] — путь к файлу игры, который требуется запустить. Пример:
При использовании данного оператора, не происходит удаления переменных, удаления предметов инвентаря, очистки дополнительного описания и строки ввода, а также остановки проигрываемых файлов. Если вам нужно очистить экран и значения всех переменных, можно прописать в начале загружаемого файла игры такие команды:
P — вывод текста в окно основного описания без перехода на новую строку. Вывод текста любым другим оператором сразу после p добавит новый текст сразу после текущего. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может быть пустой строкой '', но не должен отсутствовать. Пример:
PL — вывод текста в окно основного описания, затем переход на новую строку. Общая запись:
, где [$текст] — любая строка текста, число, или выражение любого типа. [$текст] может отсутствовать, тогда просто переход на новую строку. Пример:
PLAY — проигрывание указанного звукового файла с заданной громкостью. Общая запись:
, где [$путь к звуковому файлу] — путь к звуковому файлу относительно файла игры, [#громкость] — громкость воспроизведения в процентах от 0 до 100. Параметр [#громкость] может отсутствовать, при этом громкость принимается равной 100%. Примеры:
Если файл уже проигрывается, то изменяется громкость звучания без его "перезапуска". Поддерживается множество различных аудиоформатов и одновременное звучание до 32-х композиций.
REFINT — принудительное обновление интерфейса (в т.ч. смена цветов, шрифтов, назначенных с помощью системных переменных).
По умолчанию обновление интерфейса происходит 2 раза в секунду (каждые 500 мс). Так же см. оператор settimer.
SAVEGAME — сохранение состояния игры в указанный файл. Общая запись:
, где [$путь] — путь к создаваемому файлу сохранения состояния игры. Если параметр [$путь] отсутствует, то вызывается окно сохранения состояния игры.
Пример:
См. также локацию-обработчик события сохранения состояния игры ($ongsave).
SET — устаревший оператор для установки значения переменной. Общая запись:
, где [название переменной] — это допустимое имя переменной, [выражение] — это допустимое для данной переменной значение.
Названия числовых переменных записываются без символа $ в начале. Названия текстовых переменных записываются с символом $ в начале. Примеры:
Данный оператор является устаревшим, как и оператор let, поскольку в настоящее время значение переменной устанавливается через присвоение:
Использование операторов set и let не рекомендуется, так как они устарели.
SETTIMER — задаёт интервал обращения к локации-счётчику. Общая запись:
, где [#выражение] — период обращения к локации-счётчику в миллисекундах. По умолчанию плеер обращается к локации-счётчику каждые 500 мс., т.е. 2 раза в секунду.
Установка периода обращения к локации-счётчику влияет и на частоту автоматического обновления настроек интерфейса.
Примеры:
Минимальное значение периода таким образом может быть 1 миллисекунда:
Однако на практике минимальное значение ограничено мощностью вашего компьютера, и оно, как правило, выше 1 миллисекунды.
SHOWACTS — управляет отображением окна действий на экране. Общая запись:
, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, окно действий отображается. Если значение выражения [#выражение] равно нулю, окно действий скрыто. Примеры:
Для удобства чтения кода можно заранее определить переменные on и off и использовать их:
SHOWINPUT — управляет отображением строки ввода на экране. Общая запись:
, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, строка ввода отображается. Если значение выражения [#выражение] равно нулю, строка ввода скрыта. Примеры:
Для удобства чтения кода можно заранее определить переменные on и off и использовать их:
SHOWOBJS — управляет отображением инвентаря на экране. Общая запись:
, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, инвентарь отображается. Если значение выражения [#выражение] равно нулю, инвентарь скрыт. Примеры:
Для удобства чтения кода можно заранее определить переменные on и off и использовать их:
SHOWSTAT — управляет отображением окна дополнительного описания на экране. Общая запись:
, где [#выражение] — это число. Обычно используются значения 0 и 1. Если значение выражения [#выражение] отлично от нуля, окно дополнительного описания отображается. Если значение выражения [#выражение] равно нулю, окно дополнительного описания скрыто. Примеры:
Для удобства чтения кода можно заранее определить переменные on и off и использовать их:
UNSELECT — отмена выделения предмета. Имеет краткую форму unsel.
При щелчке играющим по какому-либо предмету, он остаётся выделенным. Чтобы снять выделение с предмета используется данный оператор. Обычно его размещают на локации-обработчике выделения предмета.
VIEW — выводит на экран указанное изображение. В классическом плеере изображение выводися в отдельном окошке (окно предпросмотра), в AeroQSP и Quest Navigator изображение выводится верхним слоем в общем окне. Общая запись:
, где [$путь к графическому файлу] — путь к файлу картинки. Если параметр [$путь к графическому файлу] отсутствует, или задан как '' (пустая строка), окно предпросмотра закрывается.
Примеры:
WAIT — приостановка выполнения кода программы на указанное количество миллисекунд. Общая запись:
, где [#миллисекунды] — время в миллисекундах, на какое следует остановить выполнение кода программы.
Пример:
Использовать данный оператор необходимо с осторожностью, поскольку приостановка выполнения кода блокирует для игрока возможность взаимодействовать с игрой.
XGOTO — переход на указанную локацию без очистки окна основного описания. Общая запись:
, где [$локация] — название локации, на которую должен быть осуществлён переход. Аргументы [аргумент 0], [аргумент 1] и т.д. могут использоваться на этой локации, их значения автоматически помещаются в переменные args[0], args[1], и т.д. соответственно. Использование аргументов не обязательно.
При переходе на новую локацию при помощи xgoto не очищается окно основного описания, а базовое описание новой локации добавляется к уже имеющемуся тексту в окне основного описания. Список действий очищается, затем в окно действий выводятся базовые действия, а так же выполняется код из поля "Выполнить при посещении" локации [$локация]. Так же при переходе на новую локацию изменяется значение, возвращаемое функцией $curloc.
Примеры:
Оператор имеет краткую форму xgt:
Aleks Versus'HowDo-F.A.Q.'2021-2022
Aleks Versus'Game Adventure Making'Really Unimaginable Stories'2013-2022
1.1. В чём разница между set x=10, let x=10 и x=10?
1.2. В чём разница между переменной со знаком $ и без знака $?
1.3. В чём разница между ' ' (апострофы) и " " (кавычки)?
1.4. В чём разница между *pl "строка" и просто " строка" ?
1.5. Чем отличаются эти две команды? *pl "<<$perem>>" и *pl $perem
1.6. В чём разница между dynamic и dyneval?
1.7. В чём разница между gt и goto?
1.8. Чем отличается goto от gosub?
18.1. Чем отличаются команды addqst и openqst?
Источники и дополнительные материалы
2.1. Как сделать, чтобы значение переменной изменялось с течением времени?
2.2. Как сделать, чтобы из одной локации меня через пару секунд перебрасывало в другую локацию?
2.3. Как сделать, чтобы через пару секунд после входа на локацию появлялось новое действие?
2.4. Как сделать, чтобы цикл выполнялся параллельно остальному коду, а не прерывал его?
Источники и дополнительные материалы
3.1. Как вывести на экран отдельное окошко с текстом? | Подскажите аналог команды alert в QSP.
3.2. Как вывести на экран окошко, в котором игрок должен ввести текст? | Подскажите аналог команды prompt в QSP.
3.3. Как прикрутить возможность выбора варианта к окну msg? | Подскажите аналог команды confirm в QSP.
3.4. Как сделать ввод имени игроком?
3.5. Как увеличить число правильных ответов, которые может ввести игрок? | Как сделать варианты для ответа через $input?
Источники и дополнительные материалы
4.1. Как сделать меню предмета?
4.2. Как сделать разные меню для двух и более предметов?
4.3. Как сделать меню в ссылках?
4.4. Как передавать локациям-пунктам меню аргументы?
4.5. Как делать контекстное (динамическое) меню?
4.6. Как вставить разделитель в меню?
4.7. Как вставить картинки в меню?
Источники и дополнительные материалы
5.1. Как сделать так, чтобы не писать один и тот же код в каждой локации?
5.2. Как сделать кнопку "Назад", работающую на каждой локации?
5.3. Почему в args на локации-обработчике перехода на новую локацию уже есть данные?
Источники и дополнительные материалы
6.1. Как вставить музыку или звук в игру?
6.2. Как запустить две звуковые дорожки?
6.3. Как при переходе на новую локацию прервать одну мелодию и запустить другую?
6.4. Как перезапустить звуковую дорожку?
Источники и дополнительные материалы
7.1. Как делать гиперссылки, по нажатию на которые выполняется код? | Как делать кликабельный текст? | Как сделать, чтобы по нажатию на текст что-то происходило?
7.2. Как менять цвет гиперссылки?
7.3. Как помещать в гиперссылки сложный код?
7.4. Как сделать гиперссылки без подчёркивания?
Источники и дополнительные материалы
8.1. Какой командой можно очистить окно дополнительного описания?
8.2. Существует ли команда для того, чтобы получить название текущей локации?
8.3. Какой командой можно вывести текст в окно дополнительного описания?
8.4. Есть ли команда, которая делает выход из игры?
Источники и дополнительные материалы
9.1. Как вставить картинку в игру?
9.2. Можно ли вставить в игру gif-файл?
9.3. Как вставить картинку в действие?
9.4. Как поставить картинку фоном?
9.5. Как выводить изображения послойно? Накладывать друг на друга?
9.6. Как сделать кликабельное изображение? | Как сделать так, чтобы при щелчке по изображению выполнялись какие-то действия?
9.7. Как сделать сменяемое изображение на локации?
9.8. Как сделать вывод рандомного изображения?
Источники и дополнительные материалы
10.1. Для чего нужен оператор REFINT, и как он работает?
10.2. Как изменить цвет фона в игре?
10.3. Как изменить формат части текста? Размер, цвет, наклон и т.д.?
10.4. Как сделать красивый фон в классическом плеере?
10.5. Хочу, чтоб в игре окна располагались определённым образом. Как это сделать?
10.8. Как изменить цвет подсветки действий?
10.9. Как изменить цвет фона для отдельного окна?
10.10. Как сделать плавное появление текста? | Как сделать плавное изменение цвета фона? | Как сделать плавное изменение цвета текста?
10.11. Как использовать в игре собственный шрифт?
10.12. С предметов можно снимать выделение, а можно ли снять выделение с действия?
Источники и дополнительные материалы
11.1. При проверке условия записано просто число, без операции сравнения, но QSP не выдаёт ошибку. Почему?
11.2. Как сделать так, чтобы действие появлялось только при определённом условии?
11.3. Видел в одной из игр, как после нажатия на действие, оно становится неактивным. Как это сделать?
11.4. Как добавить текст, который будет выводиться только при выполнении определённого условия?
11.6. Как упростить условие с логическим И (AND)?
11.7. Как упростить взаимоисключающие условия? Логическое XOR.
Источники и дополнительные материалы
12.1. Зачем нужен оператор dynamic?
12.2. Можно ли сделать переменную с рандомным (случайным) названием?
12.3. Создаю действия с помощью цикла, но они работают неправильно. Что делать?
12.4. Почему не работает dynamic?
Источники и дополнительные материалы
13.1. Рисую таблицу и хочу зафиксировать высоту, но атрибут height не работает.
13.2. Пытаюсь использовать разные HTML-теги в игре, но они не работают — просто не выводятся. Почему?
13.3. Не работает IIF!
13.4. Пытаюсь сделать кликабельную картинку с помощью тегов MAP и AREA, но ничего не получается. | Не выводится картинка, не работает область клика, область клика смещена.
13.5. Не работает *pl в действии с goto.
13.6. В AeroQSP не работает атрибут.
13.7. Не работает гиперссылка в AeroQSP.
13.8. Не работает оператор JUMP — не может найти метку.
13.9. Не работает многострочный код. Как исправить?
13.10. Не работает многострочный код. Как исправить?
13.11. Сколько END`ов нужно добавить?
13.12. Не работает условие. Как исправить? (if skrom>10 and <15)
13.13. Не работают десятичные дроби, дробные числа, числа с запятыми!
Источники и дополнительные материалы
14.1. Как добавить предмет в окно предметов?
14.2. Как удалить предмет из окна предметов?
14.3. Как удалить все предметы?
14.4. Как добавить предмет в определённую позицию в окне предметов?
14.5. Как заменить один предмет на другой?
14.6. Как делать динамические/считаемые предметы? | Как делать стакающиеся предметы? | Как делать предметы рядом с названиями которых выводится их количество?
14.7. Как добавить предмет с картинкой но без названия?
14.8. Как сделать, чтоб при щелчке по предмету выполнялся какой-либо код?
14.9. Как снять выделение предмета? | Как сделать, чтобы выбранный предмет можно было кликнуть ещё раз?
14.10. Как сделать два списка предметов? Например для игры за разных персонажей.
14.11. Как сделать, чтобы плеер выполнял определённый код при добавлении любого предмета?
14.12. Как сделать два разных предмета с одинаковыми названиями?
14.13. Как сделать многоуровневый рюкзак? | Как сделать предметы в предметах?
14.14. Можно ли выводить предметы не в окне предметов?
Источники и дополнительные материалы
15.1. Зачем вообще нужна строка ввода (поле ввода)?
15.2. Как задействовать строку ввода в игре?
Источники и дополнительные материалы
16.1. Можно ли писать текст поверх вставленной картинки (не бэкграунда)?
16.2. Возможно ли сделать плавный переход между локациями?
16.3. Как расположить картинку справа, а текст слева?
16.4. Как ограничить размер выводимого изображения?
16.5. Как сделать рамку окна основного описания? | Как сделать, чтобы картинки шли по контуру основного окна?
16.6. Как сделать вывод предметов магазина не длинным списком, а в виде таблицы?
16.7. Можно ли зеркально отразить картинку методами плеера? | Можно ли задать максимальную или минимальную ширину элементу? | Можно ли вычислить доступное место в основном окне?
16.9. Можно как нибудь вывести текст в два столба в классике? К примеру характеристики персонажей.
16.10. Как работать с тегами MAP и AREA? Как разметить картинку на кликабельные зоны?
Источники и дополнительные материалы
17.1. Как запретить игроку самостоятельно сохранять игру?
17.3. Как сделать чекпойнты в игре?
Источники и дополнительные материалы
18.1. Чем отличаются команды addqst и openqst?
18.2. Как сделать лаунчер?
18.3. Мне нужно узнать, есть ли в папке файл (картинка, музыка и т.д.). Как это сделать?
Источники и дополнительные материалы
19.1. Как использовать ASCII-графику в QSP?
19.2. Как вставить в игру видео?
19.3. Как сделать так, чтобы текст появлялся на экране постепенно? По буквам?
19.4. Как защитить игру от чита?
19.5. Как задействовать клавиатуру в игре?
19.6. Как пропустить прохождение нескольких глав, чтобы протестировать вновь написанную главу и только её?
19.7. Как из под плеера выполнить произвольную строку кода?
19.8. Как узнать, на каком устройстве запущена игра? Телефон, компьютер, планшет?
19.9. Как обновлять переменные на экране?
19.10. Как сделать, чтобы текст выводился снизу вверх?
Источники и дополнительные материалы
20.1. Как сделать возврат на предыдущую локацию?
20.2. Как проверить число на чётность?
20.4. Как сделать, чтобы текст выводился не внизу окна основного описания, а сверху?
20.5. Как можно удалить часть текста из описания?
20.6. Как вывести на экран HTML-разметку, не отключая режим распознавания HTML? То есть при usehtml=1.
20.8. Как в QSP сравнить два массива?
20.11. Как сделать проценты?
20.12. Как решить задачу по поиску случайного набора слагаемых?
20.13. Как разредить текст пробелами?
20.14. Как сделать записную книжку в игре?
20.15. Как сделать так, чтобы на локацию можно было зайти только один раз?
20.16. Как заставить действия выводиться в нужном мне порядке?
20.17. Как сделать в игре книгу? Чтобы её можно было взять и потом прочитать?
20.18. Как сделать склад, сундук, тайник, место, в котором можно выкладывать и хранить предметы?
20.19. Как сделать выпадение случайного действия на локации?
20.20. Как сделать перемещение на случайную локацию?
20.21. Как сделать случайный предмет?
20.22. Как узнать, какие переменные есть в игре? Может для этого есть специальная команда?
20.23. Как убрать преформатирование из HTML-разметки?
Источники и дополнительные материалы
Источники и дополнительные материалы
22.1. Пишу несколько игр в Quest Navigator. Как сделать, чтобы у каждой игры было собственное оформление?
22.2. Как подключить свой шрифт к игре?
22.4. Хочу прописать игре собственный вид курсора, как это сделать?
22.6. Как узнать, на каком плеере запущена игра, на классическом QSP, или на Quest Navigator?
22.7. Как вставить видео в игру на Навигаторе?
22.8. Как делать standalone-сборку на Навигаторе? | Независимая сборка на Quest Navigator
22.10. Как выполнить JavaScript прямо из кода QSP?
22.11. Инструкция посмене оформления из кода QSP?
Источники и дополнительные материалы
23.2. Хочу разместить на локации около 100 действий. Это вообще возможно?
Источники и дополнительные материалы
24.1. Как сделать так, чтобы AeroQSP запускался прямо из Quest Generator?
24.2. Как сделать StandAlone-сборку на классическом плеере? | Можно ли сделать игру так, чтобы играть без плеера? | Как сделать пакетный файл запуска, чтобы игрок тыкал иконку start и сразу начинал играть?
Источники и дополнительные материалы
Алфавитный указатель ключевых слов, спецсимволов, синтаксем